package com.hsqyz.common.utils.file;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * MultipartFile 转换工具类
 *
 * @author lcz
 */
public class MultipartFileConverter {

    /**
     * 将 byte[] 转换为 MultipartFile。
     *
     * @param bytes       文件内容的字节数组
     * @param fieldName   表单字段的名称
     * @param fileName    文件名
     * @param contentType 内容类型
     * @return 转换后的 MultipartFile 对象
     * @throws IOException 如果转换过程中发生 I/O 错误
     */
    public static MultipartFile convertByteToMultipartFile(byte[] bytes, String fieldName, String fileName, String contentType) throws IOException {
        if (bytes == null || bytes.length == 0) {
            throw new IllegalArgumentException("输入的字节数组不能为空");
        }
        FileItem item;
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            item = factory.createItem(fieldName, contentType, false, fileName);

            try (ByteArrayOutputStream bos = new ByteArrayOutputStream(bytes.length);
                 OutputStream os = item.getOutputStream()) {
                bos.write(bytes);
                os.write(bos.toByteArray());
            }
            return new CommonsMultipartFile(item);
        } catch (IOException e) {
            throw new IOException("转换 byte[] 为 MultipartFile 时发生错误", e);
        }
    }

    /**
     * 从 URL 获取图片并转换为 MultipartFile。
     *
     * @param imageUrl    图片的 URL
     * @param fileName    文件名
     * @param contentType 内容类型
     * @return 转换后的 MultipartFile 对象
     * @throws IOException 如果下载或转换过程中发生 I/O 错误
     */
    public static MultipartFile convertUrlToMultipartFile(String fieldName, String imageUrl, String fileName, String contentType) throws IOException {
        if (StrUtil.isBlank(imageUrl)) {
            throw new IllegalArgumentException("URL 不能为空");
        }
        // 从 URL 下载图片
        byte[] bytes = HttpUtil.downloadBytes(imageUrl);

        return convertByteToMultipartFile(bytes, fieldName, fileName, contentType);
    }

}